home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-05-06 | 36.3 KB | 1,534 lines |
- ;
- ; EJEMPLOS DEL LENGUAJE CPP
- ;
-
- ; LECCION 1
- begin
- begine "psc"
- pregunta
- ¿Cuál es el principal problema que posee el lenguaje C en grandes
- proyectos informáticos?
- respuesta
- El inconveniente que tiene el C en el desarrollo de grandes sistemas
- software reside en la gran libertad que tienen los programadores en
- el acceso a los datos y a las funciones de los distintos módulos.
- ende
- begine "test"
- pregunta
-
- ¿Se puede considerar el C++ como un lenguaje orientado a objetos?
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "pcc"
- pregunta
-
- ¿Quién fue el creador del lenguaje C++?
- respuesta
- Bjarne Stroustrup
- ende
- begine "test"
- pregunta
- ¿Se puede considerar el C++ como un superconjunto del C de tal forma
- que la mayor parte de los que conocemos del C es aplicable al C++?
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- ¿Cuáles son las tres características principales de la programación
- orientada a objetos?
- respuesta
- Las tres características principales de la programación orientada a
- objetos son: encapsulación, herencia y polimorfismo.
- ende
- begine "psc"
- pregunta
-
- Da una definición de objeto en el entorno de la OOP.
- respuesta
- Un objeto es un conjunto formado por datos y funciones que manipulan
- esos datos.
- ende
- begine "psc"
- pregunta
-
- ¿Qué es lo que necesita conocer un usuario de un objeto para utilizarlo?
- respuesta
- Un usuario necesita conocer la interface o la forma de comunicarse con
- el objeto para poder utilizarlo.
- ende
- begine "test"
- pregunta
- ¿Necesita conocer un usuario cómo están implementadas las funciones de
- un objeto y cuáles son todos sus datos para poder utilizarlo en un pro-
- grama?
- opciones
- Sí necesita tales conocimientos
- No necesita tales conocimientos
- respuesta
- 2
- ende
- begine "test"
- pregunta
-
- ¿Puede un objeto heredar las características de otro objeto?
- opciones
- Sí puede
- No puede
- respuesta
- 1
- ende
- end
-
- ; LECCION 2
- begin
- begine "psc"
- pregunta
-
- ¿Cuál es la diferencia entre /* y //?
- respuesta
- Los caracteres /* indican el comienzo de un comentario que termina
- con los caracteres */. Los caracteres // indican el comienzo de un
- comentario que termina al final de la línea en la que están situados.
- ende
- begine "psc"
- pregunta
- // ¿Qué imprime printf()?
- #include <stdio.h>
- void main (void) { int i; for (int i = 2; i < 3; i++); printf ("%d", i); }
- respuesta
- El programa presentado es incorrecto:hay dos variables con el mismo nombre
- definidas en mismo nivel. La compilación de este programa provoca un error
- de compilación. Si no apareciese el primer int i, printf() imprimiría un 3
- ende
- begine "test"
- pregunta
- ¿Son var1 y var2 del mismo tipo?
- enum boolean { false, true };
- boolean var1; enum boolean var2;
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "test"
- pregunta
- // ¿Qué imprime printf()?
- #include <stdio.h>
- int i = 1; main () { int i = 2; { int i = 3; printf ("%d", ::i); } }
- opciones
- El valor 0.
- El valor 1.
- El valor 2.
- El valor 3.
- Un valor indefinido.
- respuesta
- 2
- ende
- begine "test"
- pregunta
- // ¿Es correcto este programa?
- #include <stdio.h>
- void main (void) { int& i = 10; }
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "test"
- pregunta
- // ¿Es correcto este programa?
- #include <stdio.h>
- void main (void) { int& i; }
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "pcc"
- pregunta
- // ¿Qué imprime la sentencia printf()?
- #include <stdio.h>
- void main (void) { int x = 3; int& y = x; y += x; printf ("%d", x); }
- respuesta
- 6
- ende
- begine "pcc"
- pregunta
- // ¿Qué imprime la sentencia printf()?
- #include <stdio.h>
- main () { int x = 3; int& y = x; int& z = y + x; printf ("%d", x); }
- respuesta
- 3
- ende
- begine "pcc"
- pregunta
- // ¿Qué imprime la sentencia printf()?
- #include <stdio.h>
- main () { int& x = 3; int& y = x; int& z = y + x; printf ("%d", x); }
- respuesta
- 3
- ende
- begine "test"
- pregunta
- ¿Es legal esta definición de función?
- char& f (void) { char d; return d; }
- opciones
- SI
- NO
- respuesta
- 2
- ende
- begine "psc"
- pregunta
-
- ¿Qué es una unión anónima?
- respuesta
-
- Una unión anónima es una unión que no tiene nombre.
- ende
- begine "test"
- pregunta
- ¿De qué tipo es esta expresión?
- double (10) - 20 + 'e' - int ((float) '\n')
- opciones
- char
- int
- float
- double
- respuesta
- 4
- ende
- begine "psc"
- pregunta
- ¿Qué diferencia hay entre f1() y f2()?
- inline void f1 (void) { printf ("Hola"); }
- void f2 (void) { printf ("Hola"); }
- respuesta
- f1() es tratada como una macro.
- f2() es una función propiamente dicho.
- ende
- begine "test"
- pregunta
-
- ¿Cuál de las declaraciones del menú es incorrecta?
- opciones
- void f1 (float = 2.3, int = 0);
- void f2 (char * = "abc");
- void f3 (int = 10, char);
- void f4 (const int = 50, double = '1');
- void f5 (register char, char = '\t');
- void f6 (register const unsigned long int x);
- respuesta
- 3
- ende
- begine "test"
- pregunta
- ¿Son correctas estas declaraciones?
- void f (double, int), f (int, double), f (double, double), f (int, int);
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Son correctas estas declaraciones?
- int x (void);
- double x (void);
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- «En C++ es preferible utilizar las funciones new y delete a las
- funciones malloc, calloc y free».
- ¿Es cierta esta afirmación?
- respuesta
-
- No, porque new y delete no son funciones sino operadores unarios.
- ende
- begine "psc"
- pregunta
- ¿Porqué esta sentencia no asigna un array de 10 punteros a funciones?
- new int (* [10]) (void);
- respuesta
- La sentencia new int (* [10]) (void); provoca un error de compilación
- porque es interpretada como: (new int) (* [10]) (void); ya que new es
- un operador unario. Lo correcto es hacer: new (int (* [10]) (void));
- ende
- begine "psc"
- pregunta
- ¿Qué fichero(s) es necesario incluir para utilizar los identificadores
- cout y cin junto con sus correspondientes operadores sobrecargados >>
- y <<?
- respuesta
- El fichero a incluir es, bien stream.h, o bien iostream.h.
- El segundo fichero es preferible al primero si se dispone de ambos.
- ende
- begine "psc"
- pregunta
- El ámbito de un nombre empieza en su punto de declaración; esto signi-
- fica que un nombre puede ser usado incluso para especificar su propio
- valor inicial. ¿Qué pasa entonces con: int x = 1; main () { int x = x; }?
- respuesta
- Las sentencias de C++ presentadas no son ilegales, pero es probable que el
- compilador informe del aviso: variable utilizada antes de que se le asigne
- un valor. A la variable local x no se le asigna el valor de la x global.
- ende
- begine "test"
- pregunta
- ¿Es legal esta definición?
- void f (int x) { int x; }
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "test"
- pregunta
- // ¿Son correctas estas sentencias?
- struct s1 { int a, b; };
- s1 x = { 3, 4 }; s1 y = x;
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- // ¿Son correctas estas sentencias?
- struct s1 { int a; }; struct s2 { int b; };
- s1 x = { 3 }; s1 y = x;
- respuesta
- Las sentencias anteriores no son correctas puesto que s1 y s2 son
- de dos tipos diferentes. Aparece un error de compilación en la
- asignación: y = x.
- ende
- begine "test"
- pregunta
- ¿Es legal esta declaración?
- const int a;
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "prpr"
- /*
- Convierte este programa C (o estilo C en C++) en un programa C++.
-
- Para ello realiza los siguientes cambios:
-
- - Convierte los comentarios que abarcan una línea con el estilo de
- comentario //.
-
- - Haz inline la función desplazar().
-
- - Convierte los parámetros de desplazar() en llamadas por referencia
- utilizando el operador de referencia & en vez de la notación puntero
- que es más engorrosa.
-
- - Cambia la inclusión del fichero stdio.h por el iostream.h (si no
- dispones de este fichero, utiliza stream.h) para utilizar el flujo
- de salida cout en vez de la función printf().
- */
-
- #include <stdio.h>
-
- /* desplazamiento circular de pc1 hacia pc4 */
- void desplazar (char *pc1, char *pc2, char *pc3, char *pc4)
- {
- char temp;
- temp = *pc1, *pc1 = *pc2, *pc2 = *pc3, *pc3 = *pc4, *pc4 = temp;
- }
-
- /* función principal */
- void main (void)
- {
- char c1, c2, c3, c4;
-
- c1 = 'A', c2 = c1 + 1, c3 = c2 + 1, c4 = c3 + 1;
-
- printf ("\nValores iniciales: %c %c %c %c", c1, c2, c3, c4);
-
- desplazar (&c1, &c2, &c3, &c4);
-
- printf ("\nValores finales: %c %c %c %c", c1, c2, c3, c4);
- }
- ende
- begine "prpr"
-
- Intenta convertir los programas de ejemplos que se encuentran en el
- tutor de C a programas C++.
- ende
- end
-
- ; LECCION 3
- begin
- begine "psc"
- pregunta
- ¿Cómo se les llama a los elementos de un objeto (un objeto es una
- variable de tipo estructura, clase o unión)?
- respuesta
-
- Miembros. Un objeto puede tener datos miembros y funciones miembros.
- ende
- begine "psc"
- pregunta
- ¿De qué tipos pueden ser los miembros de un objeto desde el punto de
- vista de la visibilidad?
- respuesta
- Desde el punto de vista de la visibilidad o la accesibilidad a ellos,
- los miembros de un objeto pueden ser públicos, privados y protegidos.
- Estos últimos no se han explicado en esta lección.
- ende
- begine "test"
- pregunta
- ¿Es correcta esta declaración?
- struct estructura { private: public: private: int x; };
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- ¿Es correcta esta declaración?
- struct { int x; };
- respuesta
- No es correcta: esta declaración no declara nada. C++ requiere que sea
- declarado algo. Para que sea correcta tendría que declararse un tipo y/o
- una variable. Ejemplos: struct tst { int x; }; struct { int x; } vst;
- ende
- begine "test"
- pregunta
- ¿Es correcta esta declaración?
- struct estructura { private: public: private: int x; public: };
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Es correcta esta declaración?
- struct { int x; } s = { 10 };
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Es correcta esta declaración?
- struct { private: int x; } s = { 10 };
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Es correcta esta declaración?
- class { int x; } c = { 10 };
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Es correcta esta declaración?
- class { public: int x; } c = { 10 };
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Es correcta esta declaración?
- class { public: int x; } c = 10;
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Es inline la función f()?
- class clase { int x; public: void f (void) { x = 0; } };
- opciones
- Sí lo es
- No lo es
- respuesta
- 1
- ende
- begine "pcc"
- pregunta
- #include <iostream.h> // ¿Qué valor se imprime en la salida estándar?
- int x=1; struct st { int x; int dev () { int x=3; return x+st::x+::x; } };
- void main (void) { st s = { 2 }; cout << s.dev (); }
- respuesta
- 6
- ende
- begine "pcc"
- pregunta
- #include <iostream.h> // ¿Qué valor se imprime en la salida estándar?
- int x=1; struct st { int x; int dev () { int x=3; return x+st::x+::x; } };
- void main (void) { int x = 4; st s = { 2 }; cout << s.dev (); }
- respuesta
- 6
- ende
- begine "pcc"
- pregunta
- #include <iostream.h> // ¿Qué valor se imprime en la salida estándar?
- struct st { int x; static int y; void inic() { x=0; y++; } }; int st::y=0;
- void main (void) { st s1, s2; s1.inic(),s2.inic(); cout << s1.x << s1.y; }
- respuesta
- 02
- ende
- begine "psc"
- pregunta
- class X { int x; // ¿Dónde está el error en esta declaración anidada?
- class Y { int y;
- int devx (void) { return x; } int devy (void) { return y; } }; };
- respuesta
- En que la función miembro devx() de la clase Y intenta acceder a x que
- es un miembro privado de la clase X. Esto error viene de que las clases
- X e Y están declaradas, en realidad, al mismo nivel, aunque no lo parezca.
- ende
- begine "psc"
- pregunta
-
- ¿Cuáles son los operadores específicos de C++?
- respuesta
- Los operadores específicos de C++, esto es, los que no posee el C, son:
-
- new delete :: .* ->*
- ende
- begine "prpr"
-
- Modifica el programa del primer ejemplo de esta lección, en el cual
- está implementado la clase ent, para cambiar esta clase por la clase
- uent. La clase uent tiene el mismo propósito que la clase ent pero
- en vez de trabajar con el tipo int, trabaja con el tipo unsigned int.
- ende
- end
-
- ; LECCION 4
- begin
- begine "test"
- pregunta
- ¿Debe tener obligatoriamente un constructor de una clase el mismo
- nombre que la clase?
- opciones
- Sí es obligatorio
- No es obligatorio
- respuesta
- 1
- ende
- begine "psc"
- pregunta
-
- ¿Cuál debe ser el nombre del destructor de una clase?
- respuesta
- El nombre del destructor de una clase debe ser el nombre de la clase
- precedido por el carácter ~.
- ende
- begine "test"
- pregunta
-
- ¿Pueden sobrecargarse y tener argumentos por defecto los constructores?
- opciones
- Sí
- No
- respuesta
- 1
- ende
- begine "test"
- pregunta
-
- ¿Pueden sobrecargarse y tener argumentos por defecto los destructores?
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Son correctas estas declaraciones?
- class clase { int x; public: clase (int = 0, int = 0, int = 0); };
- clase c1 (10), c2, c3 (1, -2), c4 (10, 20, 30);
- opciones
- Sí lo son.
- No lo son.
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- ¿Qué condición debe cumplir los constructores de una clase para que
- dicha clase pueda ser el tipo base de un vector?
- respuesta
- Para declarar un vector de objetos con constructores, estos objetos
- deben tener un constructor que no acepte ningún argumento.
- ende
- begine "psc"
- pregunta
- struct sta { int x; sta::sta (int i = 0) { x = i; } };
- struct stb { int x; sta sa; stb::stb (int i = 1): sa (2 * i) { x = i; } };
- void main (void) { stb sb; cout << sb.x << sb.sa.x; } //¿qué imprime cout?
- respuesta
- Tal y como está, el compilador informará de símbolo indefinido en cout, ya
- que no se ha incluido ni el fichero stream.h ni el fichero iostream.h. Si
- se hubiese incluido uno de estos dos ficheros, el programa imprimiría «12»
- ende
- begine "pcc"
- pregunta
- #include <iostream.h> // ¿Qué imprime este programa?
- struct x { int a; x (int i) { a = i; } int dev (void) { return
- a + x::a + this->a; } }; void main (void) { x x (3); cout << x.dev (); }
- respuesta
- 9
- ende
- begine "test"
- pregunta
- ¿Es correcta la declaración de cl?
- class clase { int x; clase (int i = 0) { x = i; } } cl (4);
- opciones
- Sí es correcta
- No es correcta
- respuesta
- 2
- ende
- begine "psc"
- pregunta
-
- ¿Cuál es el primer argumento de las funciones miembros?
- respuesta
- El primer argumento de todas las funciones miembros está oculto, aunque
- lo podemos utilizar, y es un puntero al objeto para el cual se ha invo-
- cado la función miembro; el nombre de este puntero es this.
- ende
- begine "psc"
- pregunta
- ¿Qué crees que hace el compilador de C++ para no permitir que una
- función miembro constante modifique algún dato miembro de ese objeto?
- respuesta
- A toda función miembro de una clase X se le pasa el puntero this. Por de-
- fecto, el tipo de this es X *const (puntero constante a tipo X). El cali-
- ficador const cambia el tipo a const X *const (punt. const. a dato const.)
- ende
- begine "prpr"
-
- Modifica el programa del primer ejemplo de esta lección, en el cual
- está implementado la clase conj_int, para cambiar esta clase por la
- clase conj_cad. La clase conj_cad tiene el mismo propósito que la
- clase conj_int pero en vez de trabajar con enteros, trabaja con ca-
- denas de caracteres.
- ende
- begine "prpr"
-
- Añade las siguientes funciones miembros a la clase lista implementada
- en el segundo ejemplo de esta lección. Modifica la función main() para
- probar las nuevas funciones miembros implementadas.
-
- // lista es un construtor cuyo inicializador es un array de caracteres
- lista::lista (char *s);
-
- // longitud devuelve la longitud de la lista, esto es, el número de
- // nodos que tiene
- int lista::longitud (void);
-
- // devuelve el número de nodos de la lista que contienen como dato el
- // valor c
- int lista::cont_c (char c);
-
- // suprime todos lo nodos de la lista que tengan como dato el valor c
- void lista::quitar_c (char c);
- ende
- end
-
- ; LECCION 5
- begin
- begine "test"
- pregunta
- ¿De qué tipo es esta expresión?
- 'a' + 0
- opciones
- char
- int
- long
- float
- double
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿De qué tipo es esta expresión?
- int (2.1) + float (5)
- opciones
- char
- int
- long
- float
- double
- respuesta
- 4
- ende
- begine "test"
- pregunta
- ¿De qué tipo es esta expresión?
- 2L - 6 + (unsigned) 5
- opciones
- char
- int
- long
- float
- double
- respuesta
- 3
- ende
- begine "test"
- pregunta
- ¿De qué tipo es esta expresión?
- (int) 5 + (double) 4.0
- opciones
- char
- int
- long
- float
- double
- respuesta
- 5
- ende
- begine "pcc"
- pregunta
- ¿Qué escribe la siguiente sentencia?
- cout << float (int (5.6));
- respuesta
- 5
- ende
- begine "test"
- pregunta
- ¿Son equivalentes estas dos expresiones?
- (int) 2 + 3.0
- int (2 + 3.0)
- opciones
- Sí son equivalentes
- No son equivalentes
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Son equivalentes estas dos expresiones?
- (int) (2 + 3.0)
- int (2 + 3.0)
- opciones
- Sí son equivalentes
- No son equivalentes
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Son equivalentes estas dos declaraciones?
- struct st { int x; st (int i) { x = i; } } st = { 5 };
- struct st { int x; st (int i) { x = i; } } st = 5;
- opciones
- Sí son equivalentes
- No son equivalentes
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Son equivalentes estas dos declaraciones?
- class cl { int x; st (int i) { x = i; } } cl = { 5 };
- class cl { int x; public: st (int i) { x = i; } } cl = 5;
- opciones
- Sí son equivalentes
- No son equivalentes
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- ¿Para qué se utilizan las funciones miembros definidas de esta forma?
- operator tipo () { ... }
- respuesta
- Este tipo de funciones se utilizan para realizar conversiones de tipos
- (implícitas y explícitas) del tipo de la clase en la que está definida
- al tipo que lleva el nombre de dicha función operator.
- ende
- begine "psc"
- pregunta
-
- ¿Para qué se utiliza el especificador friend?
- respuesta
- El especificador friend se utiliza para declarar funciones y clases
- amigas de otra clase. Las funciones y clases amigas a una clase pueden
- acceder a los miembros privados de esa clase.
- ende
- begine "test"
- pregunta
-
- ¿Qué operador del menú no se puede sobrecargar?
- opciones
- Operador coma ,
- Operador de miembro .
- Operador new
- Operador delete
- Operador de llamada a función ()
- Operador de indexado []
- Operador de puntero de clase ->
- respuesta
- 2
- ende
- begine "test"
- pregunta
- Si sobrecargamos el operador ++ para el tipo X, ¿podemos distinguir
- entre preincremento y postincremento cuando este operador se aplica
- a un operando de tipo X?
- opciones
- Sí se puede distinguir
- No se puede distinguir
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Se pueden definir nuevos tokens (símbolos) de operadores, por
- ejemplo, el token ** para representar un operador de potencia?
- opciones
- Sí se pueden definir
- No se pueden definir
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Se conserva la asociatividad y la precedencia en los operadores
- sobrecargados?
- opciones
- Sí se conserva
- No se conserva
- respuesta
- 1
- ende
- begine "psc"
- pregunta
-
- ¿Cuál es el nombre de una función operador?
- respuesta
- El nombre de una función operador está compuesto por la palabra clave
- operator seguida por el operador.
- ende
- begine "test"
- pregunta
-
- ¿Es obligatorio que las funciones de operadores sean funciones miembros?
- opciones
- Sí es obligatorio
- No es obligatorio
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Es correcta esta declaración?
- class x { x operator+ (x, x); };
- opciones
- Sí es correcta
- No es correcta
- respuesta
- 2
- ende
- begine "test"
- pregunta
-
- ¿Hay algún operador predefinido que se pueda aplicar a los objetos?
- opciones
- Sí lo hay
- No lo hay
- respuesta
- 1
- ende
- begine "test"
- pregunta
- Si sobrecargamos el operador ++ para la clase X siendo x un objeto de
- tipo X, ¿podemos decir que x++ es equivalente a x+=1?
- opciones
- Sí es equivalente
- No es equivalente
- respuesta
- 2
- ende
- begine "psc"
- pregunta
-
- ¿Por qué motivo no se pueden sobrecargar los operadores # y ##?
- respuesta
- Los operadores # y ## no se pueden sobrecargar porque no son operadores
- del lenguaje C++ sino del preprocesador de C++.
- ende
- begine "psc"
- pregunta
- ¿Por qué es preferible pasar por referencia a las funciones los
- objetos grandes?
- respuesta
- Si se pasa un objeto x por referencia, se está pasando una dirección
- (normalmente son 2 ó 4 bytes), pero si se pasa por valor, se está pa-
- sando el objeto x completo, es decir, se están pasando sizeof(x) bytes.
- ende
- begine "psc"
- pregunta
-
- ¿En qué consiste la asignación e inicialización por defecto entre objetos?
- respuesta
- Por defecto, las asignaciones e inicializaciones entre objetos consisten
- en la copia del contenido de uno al contenido del otro, haciéndose esta
- copia elemento a elemento.
- ende
- begine "test"
- pregunta
-
- ¿Es siempre lo mismo asignación que inicialización?
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- ¿Cómo podemos cambiar la asignación e inicialización por defecto para
- un objeto?
- respuesta
- Sea la clase X. Podemos cambiar la inicialización por defecto declarando
- el constructor: X (&X); La asignación por defecto la podemos cambiar de-
- clarando la función del operador =: X& operator= (X&);
- ende
- begine "psc"
- pregunta
- ¿Cuáles son los tres casos en los que se producen inicializaciones de
- una determinada clase X?
- respuesta
- 1. Cuando la clase X es inicializada por otra clase X.
- 2. Cuando la clase X es pasada como argumento a una función.
- 3. Cuando la clase X es devuelta como el valor de una función.
- ende
- end
-
- ; LECCION 6
- begin
- begine "test"
- pregunta
- ¿Son equivalentes las dos declaraciones siguientes?
- class b : d { /* ... */ };
- class b : public d { /* ... */ };
- opciones
- Sí son equivalentes
- No son equivalentes
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Se puede decir que la clase Y es una clase derivada de la clase X?
- class X { /* ... */ };
- class Y { private: class X x; public: /* ... */ };
- opciones
- Sí
- No
- respuesta
- 2
- ende
- begine "pcc"
- pregunta
- ¿Cuántos especificadores de acceso o modificadores de visibilidad
- existen en C++?
- respuesta
- 3
- ende
- begine "psc"
- pregunta
- ¿Hay alguna forma de acceder a un miembro privado de una clase sin
- que el acceso se produzca desde una función miembro de esa clase?
- respuesta
- Sí. Se puede acceder a un miembro privado de una clase, además de
- desde los miembros de esa clase, desde una función o clase amiga a
- esa clase.
- ende
- begine "test"
- pregunta
- Sea
- class d : private b { /* ... */ };
- ¿Puede la clase d acceder a los miembros protected de la clase b?
- opciones
- Sí puede
- No puede
- respuesta
- 1
- ende
- begine "test"
- pregunta
- Sea
- class d : public b { /* ... */ };
- ¿Puede la clase d acceder a los miembros private de la clase b?
- opciones
- Sí puede
- No puede
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- ¿Es correcto invocar al constructor de b de esta forma?
- class b { private: int x; public: b (int i) { x = i; } };
- class d : public b { public: d (int i) : (i) { } };
- respuesta
- Sí se puede invocar al constructor de la clase base sin poner su nombre,
- poniendo sólo sus argumentos. Esta forma se considera obsoleta en el ac-
- tual estándar de C++ y se recomienda no utilizarla. Sería: d(int i):b(i){}
- ende
- begine "test"
- pregunta
- ¿Puede tener una clase derivada una función miembro con el mismo
- nombre que una función miembro de la clase base?
- opciones
- Sí puede
- No puede
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Cuál es el orden de llamadas de los constructores de una clase
- derivada que también contiene objetos con constructores?
- opciones
- Constr clase base; Constr de los miembros; Constr de propia clase derivada
- Constr de propia clase derivada; Constr de los miembros; Constr clase base
- Constr de los miembros; Constr clase base; Constr de propia clase derivada
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Es cierto que los destructores se llaman siempre en orden contrario
- al orden de llamadas de los constructores?
- opciones
- Sí es cierto
- No es cierto
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Es cierta la siguiente afirmación?
- Una clase base es un subtipo de sus clases derivadas.
- opciones
- Sí es cierta
- No es cierta
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Son equivalentes las asignaciones de pb1 y pb2?
- class base { /* ... */ } b; class derivada: public base { /* ... */ } d;
- base *pb1 = &d; base *pb2 = (derivada *) &d;
- opciones
- Sí son equivalentes
- No son equivalentes
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Son equivalentes las asignaciones de pb1 y pb2?
- class base { /* ... */ } b; class derivada: private base { /* ... */ } d;
- base *pb1 = &d; base *pb2 = (base *) &d;
- opciones
- Sí son equivalentes
- No son equivalentes
- respuesta
- 2
- ende
- begine "psc"
- pregunta
- ¿Qué debemos hacer para obligar al compilador que seleccione las
- funciones miembros a invocar, en tiempo de ejecución?
- respuesta
- Debemos declarar tales funciones como virtuales, ello se consigue
- precediendo el prototipo de la función virtual con la palabra cla-
- ve virtual en la clase base.
- ende
- begine "test"
- pregunta
-
- ¿Pueden ser los destructores funciones virtuales?
- opciones
- Sí pueden ser virtuales
- No pueden ser virtuales
- respuesta
- 1
- ende
- begine "psc"
- pregunta
- Si declaramos una función miembro como virtual en la clase base, y la
- declaramos en las clases derivadas con tipos de argumentos diferentes,
- ¿se aplica el mecanismo de función virtual?
- respuesta
- En ese caso no se aplica el mecanismo de función virtual, puesto que al
- tener tipos de argumentos diferentes son funciones diferenciables y la
- función a invocar se selecciona sin problemas en tiempo de compilación.
- ende
- begine "psc"
- pregunta
-
- ¿Qué es una función pura?
- respuesta
- Una función pura es una función virtual declarada pero no definida en
- las clases bases.
- ende
- begine "psc"
- pregunta
-
- ¿Cómo se declara una función virtual pura?
- respuesta
- Una función virtual pura se declarara añadiendo
- = 0
- al final de la declaración de la función virtual.
- ende
- begine "test"
- pregunta
- ¿Es posible redeclarar una función pura de una clase base como función
- pura nuevamente en su clase derivada?
- opciones
- Sí se puede
- No se puede
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Podemos definir una función virtual en una clase base y no redefinirla
- ni redeclararla en sus clases derivadas?
- opciones
- Sí se puede
- No se puede
- respuesta
- 1
- ende
- begine "psc"
- pregunta
-
- ¿Qué es una clase abstracta?
- respuesta
- Una clase abstracta es una clase que tiene al menos una función
- virtual pura.
- ende
- begine "test"
- pregunta
-
- ¿Se puede crear un objeto de una clase abstracta?
- opciones
- Sí se puede
- No se puede
- respuesta
- 2
- ende
- begine "test"
- pregunta
-
- ¿Están permitidas las referencias a una clase abstracta?
- opciones
- Sí están permitidas
- No están permitidas
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Qué tipo de funciones miembros es preferible utilizar si el mecanismo
- de selección dinámica de funciones no es absolutamente necesario?
- opciones
- Funciones miembros virtuales
- Funciones miembros no virtuales
- respuesta
- 2
- ende
- begine "test"
- pregunta
-
- ¿Puede ser una clase, clase base y clase derivada al mismo tiempo?
- opciones
- Sí puede ser clase base y clase derivada al mismo tiempo
- No puede ser clase base y clase derivada al mismo tiempo
- respuesta
- 1
- ende
- begine "prpr"
-
- Implementa una clase llamada lista que haga diversas operaciones
- sobre una lista dinámica. A continuación desarolla dos clases
- derivadas de la clase base lista: la clase cola y la clase pila.
-
- ende
- begine "prpr"
-
- Implementa una clase ventana que haga diversas operaciones sobre una
- ventana de texto en la pantalla: visualizarla, borrarla, moverla; la
- ventana a visualizar podrá tener diversas formas de bordes, colores,
- cabeceras, sombras, etc.
-
- Una vez implementada la clase ventana podemos diseñar diversas clases
- que se sirvan de la clase ventana haciéndola base. Estas clases deri-
- vadas pueden ser, por ejemplo, una clase para hacer menús, una clase
- para visualizar un fichero en pantalla, etc.
-
- ende
- end
-
- ; LECCION 7
- begin
- begine "psc"
- pregunta
-
- ¿Cuál es la diferencia entre herencia simple y herencia múltiple?
- respuesta
- La diferencia entre herencia simple y múltiple está que en la herencia
- simple, una clase derivada sólo puede tener una clase base, y en la
- herencia múltiple, una clase derivada puede tener más de una clase base.
- ende
- begine "test"
- pregunta
-
- ¿Es legal una jerarquía circular en C++?
- opciones
- Sí es legal
- No es legal
- respuesta
- 2
- ende
- begine "test"
- pregunta
- struct b1 { void f (void); }; struct b2 { void f (void); };
- struct d : b1, b2 { void g (void) { f (); } };
- // ¿Qué función invoca la función d::g()?
- opciones
- La función b1::f()
- La función b2::f()
- Error de ambigüedad
- respuesta
- 3
- ende
- begine "test"
- pregunta
-
- ¿Son necesarias las clases virtuales en la herencia simple?
- opciones
- Sí son necesarias
- No son necesarias
- respuesta
- 2
- ende
- begine "test"
- pregunta
- Sea la declaración
- class x : virtual public y, public z { /* ... */ };
- ¿Qué constructor es el primero que se invoca?
- opciones
- El constructor de la clase x
- El constructor de la clase y
- El constructor de la clase z
- respuesta
- 2
- ende
- begine "test"
- pregunta
- Sea la declaración
- class x : virtual public y, public z { /* ... */ };
- ¿Qué destructor es el primero que se invoca?
- opciones
- El destructor de la clase x
- El destructor de la clase y
- El destructor de la clase z
- respuesta
- 1
- ende
- begine "test"
- pregunta
-
- ¿Puede declararse un constructor como virtual?
- opciones
- Sí puede
- No puede
- respuesta
- 2
- ende
- begine "test"
- pregunta
-
- ¿Puede declararse un destructor como virtual?
- opciones
- Sí puede
- No puede
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Podemos definir funciones en un programa de C y de C++ que sean
- ejecutadas antes o después de que se ejecute la función main()?
- opciones
- Sí podemos
- No podemos
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Son equivalentes las asignaciones a c::x1 y c::x2?
- class c { private: int x1, x2; public: c (int x): x1 (x) { x2 = x; } };
- opciones
- Sí son equivalentes
- No son equivalentes
- respuesta
- 1
- ende
- begine "test"
- pregunta
- ¿Serán invocados los destructores de los objetos globales si terminamos
- el programa con la función abort()?
- opciones
- Sí serán invocados
- No serán invocados
- respuesta
- 2
- ende
- begine "test"
- pregunta
- ¿Serán invocados los destructores de los objetos globales si terminamos
- el programa con la función exit()?
- opciones
- Sí serán invocados
- No serán invocados
- respuesta
- 1
- ende
- begine "test"
- pregunta
- class b { }; // ¿Son legales las declaraciones de d1, d2, d3 y d4?
- class d1: b, b { }; class d2: virtual b, b { };
- class d3: b, virtual b { }; class d4: virtual b, virtual b { };
- opciones
- Sí lo son
- No lo son
- respuesta
- 2
- ende
- begine "prpr"
-
- Desarrolla una clase llamada posición que contenga los datos x e y
- junto con los métodos correspondientes.
-
- A continuación desarrolla una clase derivada de posición llamada punto
- que tenga como dato una variable booleana llamada visible, junto con
- los correspondientes métodos.
-
- La clase punto sirve de clase base a las clases línea y arco. La clase
- línea es base a su vez de la clase triángulo. Del mismo modo la clase
- arco es clase base de la clase círculo.
-
- Por último, podemos crear la clase circulo_con_triangulo, que tendría
- como clases bases las clases círculo y triángulo. Esta clase dibuja
- un círculo con un triángulo inscrito.
-
- Otras clases: clase mensaje que tenga como clase base la clase posi-
- ción, y que escribe una cadena de caracteres a partir de las coorde-
- nadas x e y de posición; y la clase circulo_con_mensaje, que tendría
- como clases bases las clases círculo y mensaje, y escribirá un círcu-
- lo que tenga en su interior (centrado) el mensaje de su clase base.
-
- ende
- end
-
- ; LECCION 8
- begin
- begine "psc"
- pregunta
- ¿Cuáles son los principales ficheros de cabecera relacionados con la
- entrada y la salida en C++?
- respuesta
- Los ficheros pedidos son los tres siguientes: el fichero iostream.h (flu-
- jos básicos), el fichero fstream.h (flujos relacionados con ficheros) y el
- fichero strstream.h (flujos relacionados con arrays de bytes en memoria).
- ende
- begine "psc"
- pregunta
-
- ¿Cuáles son los flujos predefinidos en el fichero iostream.h?
- respuesta
- Los flujos predefinidos en el fichero iostream.h son:
- cin, cout, cerr y clog.
- ende
- begine "psc"
- pregunta
- ¿Con qué funciones miembros de la clase ios podemos modificar los
- indicadores de formato (skipws, left, right, internal, dec, oct,
- hex, ...)?
- respuesta
- Los indicadores de formato los podemos activar o desactivar con las
- funciones miembros ios::flags(), ios::setf() y ios::unsetf().
- ende
- begine "psc"
- pregunta
- ¿Cuándo es especialmente interesante consultar los bits de estado del
- flujo con las funciones que nos informan del estado (funciones como
- ios::rdstate(), ios::eof(), ios::fail(), ios::bad(), ios::good(), ...?
- respuesta
- Las funciones citadas son especialmente interesantes cuando trabajamos
- con flujos de ficheros.
- ende
- begine "psc"
- pregunta
- ¿Cuáles son las principales funciones de lectura declaradas en la clase
- istream?
- respuesta
- Las principales funciones de lectura declaradas en la clase istream son:
- istream::get(), istream::getline() y istream::read(). También en esta
- clase se sobrecarga el operador >> para realizar lecturas sobre el flujo.
- ende
- begine "psc"
- pregunta
- ¿Cuáles son las principales funciones de escritura declaradas en la clase
- ostream?
- respuesta
- Las principales funciones de escritura declaradas en la clase ostream son:
- istream::put() y istream::write(). También en esta clase se sobrecarga el
- operador << para realizar escrituras sobre el flujo.
- ende
- begine "psc"
- pregunta
-
- ¿Cuáles son las clases bases de la clase iostream?
- respuesta
-
- Las clases bases de la clase iostream son istream y ostream.
- ende
- begine "psc"
- pregunta
-
- ¿Para qué se suelen declarar objetos de tipo ifstream?
- respuesta
- Los objetos de tipo ifstream se utilizan para trabajar con ficheros
- de sólo lectura.
- ende
- begine "psc"
- pregunta
-
- ¿Para qué se suelen declarar objetos de tipo ofstream?
- respuesta
- Los objetos de tipo ofstream se utilizan para trabajar con ficheros
- de sólo escritura.
- ende
- begine "psc"
- pregunta
-
- ¿Para qué se suelen declarar objetos de tipo fstream?
- respuesta
- Los objetos de tipo fstream se suelen utilizar para trabajar con
- ficheros en los que se puede leer y escribir simultáneamente.
- ende
- begine "psc"
- pregunta
-
- ¿Para qué se suelen declarar objetos de tipo istrstream?
- respuesta
- Los objetos de tipo istrstream se utilizan para trabajar con arrays
- de bytes de sólo lectura.
- ende
- begine "psc"
- pregunta
-
- ¿Para qué se suelen declarar objetos de tipo ostrstream?
- respuesta
- Los objetos de tipo ostrstream se utilizan para trabajar con arrays
- de bytes de sólo escritura.
- ende
- begine "psc"
- pregunta
-
- ¿Para qué se suelen declarar objetos de tipo strstream?
- respuesta
- Los objetos de tipo strstream se suelen utilizar para trabajar con
- arrays de bytes en los que se puede leer y escribir simultáneamente.
- ende
- begine "psc"
- pregunta
-
- ¿Qué clase está declarada en el fichero bcd.h?
- respuesta
- En el fichero bcd.h está declarada la clase bcd, la cual nos permite
- trabajar con números bcd (binary-code decimal).
- ende
- begine "psc"
- pregunta
-
- ¿Qué clase está declarada en el fichero complex.h?
- respuesta
- En el fichero complex.h está declarada la clase complex, la cual nos
- permite trabajar con números complejos (números que tienen parte real
- y parte imaginaria).
- ende
- begine "prpr"
-
- Añade al programa del ejemplo de string de esta lección el operador
- de concatenación + y el operador += con el significado de "añadir al
- final".
- ende
- begine "prpr"
-
- Pasa los ejemplos de C de la lección 9 del tutor de C (lección dedicada
- a la E/S y a los ficheros) a programas C++, esto es, a notación C++.
- ende
- begine "prpr"
-
- Transforma el programa compresor/descompresor, desarrollado en C en la
- tarea de ejemplos de la lección 10 del tutor de C, a un programa C++
- mejorándolo en el sentido de que pueda comprimir (y posteriormente des-
- comprimir) varios ficheros en un sólo fichero comprimido.
- ende
- end
-